package com.itany.corejava.util;

import java.util.Arrays;

/**
 * @author 石小俊
 * 2024年07月10日 16:27
 * 数组工具类
 */
public class ArrayUtil {

    /**
     * 实现复制数组的方法,将源数组的所有元素复制到目标数组中
     * @param src  源数组
     * @param dist 目标数组
     */
    public static void copyArray(int[] src, int[] dist) {
        if (dist.length == src.length) {
            for (int i = 0; i < src.length; i++) {
                dist[i] = src[i];
            }
        } else {
            System.out.println("数组长度不一致,无法复制");
        }
    }

    /**
     * 实现输出数组中元素的功能,要求数组的元素以短横杠-分隔
     * @param arr 需要输出数据的数组
     */
    public static void show(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            if (i != arr.length - 1) {
                System.out.print(arr[i] + "-");
            } else {
                System.out.print(arr[i]);
            }
        }
        System.out.println();
    }


    /**
     * 实现交换指定数组中指定位置的两个元素的值
     * @param arr 数组
     * @param i   交换元素的下标
     * @param j   交换元素的下标
     */
    public static void change(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    /**
     * 将指定数组的所有元素颠倒过来,倒序
     * @param arr   需要颠倒的原数组
     */
    public static void reverse(int[] arr) {
        for (int i = 0; i < arr.length / 2; i++) {
            int j = arr.length - 1 - i;
            change(arr, i, j);
        }
    }

    /**
     * 随机生成一个int类型的数组,通过方法的参数控制数组的长度、以及取值范围
     * 其值为指定范围x-y之间的整数,且不能重复。参数有三个:数组长度、最小值、最大值
     * @param length 数组长度
     * @param x      元素最小值
     * @param y      元素最大值
     * @return  返回一个int类型的数组
     */
    public static int[] createArray(int length, int x, int y) {
        int[] arr = new int[length];
        if (length > y - x + 1) {
            System.out.println("对不起,你提供的数值范围太小,无法赋值给数组!");
        } else {
            for (int i = 0; i < arr.length; i++) {
                // 随机生成一个x-y之间的整数赋值给数组的元素
                arr[i] = (int) (Math.random() * (y - x + 1) + x);
                // 在上面生成的随机数可能是重复的,我们要求不允许重复
                // 将已经赋值过的数组的元素与当前生成的数据进行比较
                // 判断是否重复了
                for (int j = 0; j < i; j++) {
                    if (arr[i] == arr[j]) {
                        // 如果存在重复了,此次赋值操作取消
                        // 重新赋值时,i的值还是当前i的值
                        i--;
                        // 结束内层循环
                        break;
                    }
                }
            }
        }
        return arr;
    }

    public static void main(String[] args) {
        int[] src = {1, 2, 3, 4, 5};
        int[] dist = new int[5];
        copyArray(src, dist);
        change(dist, 2, 4);
        show(dist);
        reverse(dist);
        show(dist);
        int[] arr = createArray(10, 10, 19);
        System.out.println(Arrays.toString(arr));
    }
}
